package code13.map;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.BiConsumer;

import org.junit.Test;

public class Test01 {
	@Test
	public void f1() {
		// 创建对象
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		// 添加 一个键值对
		map.put(1, "aa");
		map.put(2, "b");
		map.put(3, "b");// key 不能重复, value 可以重复
		String put = map.put(2, "bbbb");// key重复时，会修改保存的 value 的值
		System.out.println("old-2:"+put);
		map.put(0, "qwe");
		map.put(null, null);// key 可以为 null, 只能有一个key为null。
		System.out.println(map);
		System.out.println("----------");
		
		// 根据 key 取 value
		String value = map.get(2);
		System.out.println("2:"+value);
		String val2 = map.get(666);// 不存在该key
		System.out.println("val2:" + val2);// null
		String val3 = map.get(null);// 存在该key
		System.out.println("val3:" + val3);// null
		
		// 根据 key 删除 对应的 value
		String remove = map.remove(0);
		System.out.println("0-remove:" + remove);
		
		// 是否含有指定的 key
		System.out.println("containsKey1:"+map.containsKey(666));
		System.out.println("containsKey2:"+map.containsKey(null));
		// 是否含有指定 value 
		System.out.println("containsValue:"+map.containsValue("aa"));
		
		// 是否为空集合
		System.out.println("isEmpty:"+map.isEmpty());
		// 存储的元素个数
		System.out.println("size:"+map.size());
		// 清空
		map.clear();
		System.out.println("map:"+map);
	}
	
	@Test
	public void f2() {
		//遍历HashMap的三种方式：
		Map<Integer, String> map = new HashMap<Integer, String>();
		map.put(9, "99");
		map.put(7, "77");
		map.put(5, "55");
		// Map本身无法直接遍历
		
		//通过keySet()获取所有key的集合，然后遍历所有的key
		Set<Integer> keySet = map.keySet();
		for (Integer key : keySet) {
			String val = map.get(key);
			System.out.println(key + "=" + val);
		}
		System.out.println("------------");
		//通过values()获取所有value的集合，然后遍历所有的value
		Collection<String> values = map.values();
		for (String val : values) {
			System.out.println("val=" + val);
		}
		System.out.println("------------");
		//通过entrySet()获取所有key-value的集合，然后遍历所有的key-value键值对
		Set<Map.Entry<Integer,String>> entrySet = map.entrySet();
		for (Map.Entry<Integer, String> entry : entrySet) {
			System.out.println(entry.getKey() + "=" + entry.getValue());
		}
		System.out.println("------------");
		// jdk8
		map.forEach(new BiConsumer<Integer, String>() {
			@Override
			public void accept(Integer key, String value) {
				System.out.println(key + "=" + value);
			}
		});
	}
	
	@Test
	public void t1() {
		String words = "abcabc123111223";
		// 统计任意一个字符串中包含的字符种类，以及该类字符出现的次数。
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for (int i = 0; i < words.length(); i++) {
			char c = words.charAt(i);
//			// 判断该字符是否已被保存
//			if (map.containsKey(c)) {
//				// 获取上一次保存的 次数
//				Integer count = map.get(c);
//				map.put(c, count + 1);// 后续, +1
//			} else {
//				map.put(c, 1);// key 字符, value 次数, 第一次是 1
//			}
			// 三目运算
			map.put(c, map.containsKey(c) ? map.get(c)+1 : 1);
		}
		
		Set<Character> keySet = map.keySet();
		for (Character key : keySet) {
			System.out.println(key + " 出现的次数: " + map.get(key));
		}
		
		// homework 2022-03-28: 按照出现次数降序输出
		Set<Entry<Character,Integer>> entrySet = map.entrySet();
		// 创建 TreeSet， 并设置 比较器
		TreeSet<Entry<Character,Integer>> treeSet = new TreeSet<Map.Entry<Character,Integer>>(new Comparator<Map.Entry<Character,Integer>>() {
			@Override
			public int compare(Entry<Character, Integer> o1,
					Entry<Character, Integer> o2) {
				// 比较规则
				int compareTo = o2.getValue().compareTo(o1.getValue());
				if (0 == compareTo) {
					// 次数相同时, 根据 字符排序
					return o1.getKey().compareTo(o2.getKey());
				}
				return compareTo;
			}
		});
		// 把 统计到的数据添加到 TreeSet
		treeSet.addAll(entrySet);
		System.out.println("排序");
		for (Entry<Character, Integer> entry : treeSet) {
			System.out.println(entry);
		}
	}
	
}
